package huachipa.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import huachipa.excepcion.DAOExcepcion;
import huachipa.excepcion.LoginExcepcion;
import huachipa.modelo.Usuario;
import huachipa.util.ConexionBD;

public class UsuarioDAO extends BaseDAO {public Usuario obtenerPorIdUsuario(String idUsuario) throws DAOExcepcion {
	String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado "
			+ " from usuario where id_usuario=?";
	Usuario vo = new Usuario();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, idUsuario);
		rs = stmt.executeQuery();
		if (rs.next()) {
			vo.setIdUsuario(rs.getString("id_usuario"));
			vo.setClave(rs.getString("clave"));
			vo.setNombres(rs.getString("nombres"));
			vo.setPaterno(rs.getString("paterno"));
			vo.setMaterno(rs.getString("materno"));
			vo.setCorreo(rs.getString("correo"));
			vo.setDireccion(rs.getString("direccion"));
			vo.setTelefono(rs.getString("telefono"));
			vo.setEstado(rs.getString("estado"));
		}

	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public Collection<Usuario> buscarPorNombre(String nombre)
		throws DAOExcepcion {
	String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado "
			+ " from usuario where nombres like ?";
	Collection<Usuario> c = new ArrayList<Usuario>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, "%" + nombre + "%");
		rs = stmt.executeQuery();
		while (rs.next()) {
			Usuario vo = new Usuario();
			vo.setIdUsuario(rs.getString("id_usuario"));
			vo.setClave(rs.getString("clave"));
			vo.setNombres(rs.getString("nombres"));
			vo.setPaterno(rs.getString("paterno"));
			vo.setMaterno(rs.getString("materno"));
			vo.setCorreo(rs.getString("correo"));
			vo.setDireccion(rs.getString("direccion"));
			vo.setTelefono(rs.getString("telefono"));
			vo.setEstado(rs.getString("estado"));
			c.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}

public Usuario insertar(Usuario vo) throws DAOExcepcion {
	String query = "INSERT INTO usuario (id_usuario,clave,nombres,paterno,materno,correo,direccion, telefono,estado) "
			+ "VALUES (?,?,?,?,?,?,?,?,?)";
	System.err.println(query);
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, vo.getIdUsuario());
		stmt.setString(2, vo.getClave());
		stmt.setString(3, vo.getNombres());
		stmt.setString(4, vo.getPaterno());
		stmt.setString(5, vo.getMaterno());
		stmt.setString(6, vo.getCorreo());
		stmt.setString(7, vo.getDireccion());
		stmt.setString(8, vo.getTelefono());
		stmt.setString(9, vo.getEstado());

		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo insertar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public Usuario actualizar(Usuario vo) throws DAOExcepcion {
	String query = "UPDATE usuario SET clave=?, nombres=?, paterno=?, materno=?, correo=?, direccion=?,"
			+ " telefono=?, estado=? WHERE id_usuario=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, vo.getClave());
		stmt.setString(2, vo.getNombres());
		stmt.setString(3, vo.getPaterno());
		stmt.setString(4, vo.getMaterno());
		stmt.setString(5, vo.getCorreo());
		stmt.setString(6, vo.getDireccion());
		stmt.setString(7, vo.getTelefono());
		stmt.setString(8, vo.getEstado());
		stmt.setString(9, vo.getIdUsuario());

		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public void eliminar(String idUsuario) throws DAOExcepcion {
	String query = "DELETE FROM usuario WHERE id_usuario=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, idUsuario);
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo eliminar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
}

public Collection<Usuario> listarTodos() throws DAOExcepcion {
	String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado"
			+ " from usuario";
	Collection<Usuario> c = new ArrayList<Usuario>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Usuario vo = new Usuario();
			vo.setIdUsuario(rs.getString("id_usuario"));
			vo.setClave(rs.getString("clave"));
			vo.setNombres(rs.getString("nombres"));
			vo.setPaterno(rs.getString("paterno"));
			vo.setMaterno(rs.getString("materno"));
			vo.setCorreo(rs.getString("correo"));
			vo.setDireccion(rs.getString("direccion"));
			vo.setTelefono(rs.getString("telefono"));
			vo.setEstado(rs.getString("estado"));
			c.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}

public Usuario validar(String nombre, String clave)
		throws DAOExcepcion, LoginExcepcion {
	String query = "select idusuario, nombres, paterno,"
			+ "materno, correo, direccion, telefono,"
			+ "estado from usuarios where idusuario=? and clave=?";
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	Usuario vo = new Usuario();
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, nombre);
		stmt.setString(2, clave);
		rs = stmt.executeQuery();

		if (rs.next()) {
			vo.setIdUsuario(rs.getString("idusuario"));
			vo.setNombres(rs.getString("nombres"));
			vo.setPaterno(rs.getString("paterno"));
			vo.setMaterno(rs.getString("materno"));
			vo.setCorreo(rs.getString("correo"));
			vo.setDireccion(rs.getString("direccion"));
			vo.setTelefono(rs.getString("telefono"));
			vo.setEstado(rs.getString("estado"));
		} else {
			throw new LoginExcepcion("No existe");
		}
	} catch (LoginExcepcion e) {
		System.err.println(e.getMessage());
		throw new LoginExcepcion(e.getMessage());
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

}
